<?php
/**
 * Created by 王跃达.
 * User: 小马出行
 * Date: 2017/9/20
 * Time: 10:33
 */

namespace my;


class Security
{

    const key = "m.XiaoMachUxing.cn/CnCX!";
    const iv = "JkgNuiK@";

    public static function encrypt($input)
    {
        $size = mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
        $input = self::pkcs5_pad($input, $size);
        $key = str_pad(self::key, 24, '0');
        $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
        if (self::iv == '') {
            $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        } else {
            $iv = self::iv;
        }
        @mcrypt_generic_init($td, $key, $iv);
        $data = mcrypt_generic($td, $input);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        $data = base64_encode($data);
        return $data;
    }

    public static function decrypt($encrypted)
    {
        if(is_null($encrypted)||empty($encrypted)){
            return 0;
        }
        $encrypted = base64_decode($encrypted);
        $key = str_pad(self::key, 24, '0');
        $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
        if (self::iv == '') {
            $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        } else {
            $iv = self::iv;
        }
        $ks = mcrypt_enc_get_key_size($td);
        @mcrypt_generic_init($td, $key, $iv);
        $decrypted = mdecrypt_generic($td, $encrypted);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        $y = self::pkcs5_unpad($decrypted);
        return $y;
    }

    public static function pkcs5_pad($text, $blocksize)
    {
        $pad = $blocksize - (strlen($text) % $blocksize);
        return $text . str_repeat(chr($pad), $pad);
    }

    public static function pkcs5_unpad($text)
    {
        $pad = ord($text{strlen($text) - 1});
        if ($pad > strlen($text)) {
            return false;
        }
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
            return false;
        }
        return substr($text, 0, -1 * $pad);
    }

    public static function PaddingPKCS7($data)
    {
        $block_size = mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
        $padding_char = $block_size - (strlen($data) % $block_size);
        $data .= str_repeat(chr($padding_char), $padding_char);
        return $data;
    }


    /* const KEY="jfJdhsGHAHnuyuihkj15645115454GHV";
     public static function encrypt($input, $key=self::KEY) {
         $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
         $input = Security::pkcs5_pad($input, $size);
         $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
         $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
         mcrypt_generic_init($td, $key, $iv);
         $data = mcrypt_generic($td, $input);
         mcrypt_generic_deinit($td);
         mcrypt_module_close($td);
         $data = base64_encode($data);
         return $data;
     }

     private static function pkcs5_pad ($text, $blocksize) {
         $pad = $blocksize - (strlen($text) % $blocksize);
         return $text . str_repeat(chr($pad), $pad);
     }

     public static function decrypt($sStr, $sKey=self::KEY) {
         $decrypted= mcrypt_decrypt(
             MCRYPT_RIJNDAEL_128,
             $sKey,
             base64_decode($sStr),
             MCRYPT_MODE_ECB
         );

         $dec_s = strlen($decrypted);
         $padding = ord($decrypted[$dec_s-1]);
         $decrypted = substr($decrypted, 0, -$padding);
         return $decrypted;
     }*/

    public static function returnJson($arr)
    {
        return '["' . self::encrypt(json_encode($arr)) . '"]';
    }

    public static function postDecode($post)
    {
        $decode = self::decrypt($post);

        if (empty($decode)) {
            return array("status" => 0);
        }
        $decode_arr = explode("&", $decode);//array("a=1","b=2","c=3")

        foreach ($decode_arr as $v) {
            $val = explode("=", $v);
            $info[$val[0]] = $val[1];
        }
        return array("status" => 1, "data" => $info);
    }
}